// 在 TypeScript 中，我们使用接口（Interfaces）来定义对象的类型。
interface Person {
    name: string;
    age: number;
}

let tom: Person = {
    name: 'Tom',
    age: 25
};
// 定义的变量比接口少了一些属性是不允许的
// el:
// let jim: Person = {
//     name: 'zs'
// }

// 多一些属性也是不允许的：
// el:
// let jim: Person = {
//     name: 'zs',
//     age: 12,
//     weight: '56kg'
// }
// 赋值的时候，变量的形状必须和接口的形状保持一致。



// 可选属性
interface Animal {
    name: string;
    age?: number;
}

let el1: Animal = {
    name: 'dog'
}
let el2: Animal = {
    name: 'cat',
    age: 6
}
//仍然不允许添加未定义的属性：
// let el3: Animal = {
//     name: 'cat',
//     age: 8,
//     weight: '10kg' //error
// }



// 任意属性
interface XIAOJIEJIE {
    name: string;
    age?: number;
    [propName: string]: any;
}
// el:
let CUI: XIAOJIEJIE = {
    name: 'cui',
    weight: '56kg'
}

// 一个接口中只能定义一个任意属性。如果接口中有多个类型的属性，则可以在任意属性中使用联合类型
interface XIAO {
    name: string;
    age?: number;
    [propName: string]: string | number;
}



// 只读属性
// 有时候我们希望对象中的一些字段只能在创建的时候被赋值，那么可以用 readonly 定义只读属性
// interface Teacher {
//     readonly id: number;
//     name: string;
//     age?: number;
//     [propName: string]: any;
// }

// let te1: Teacher = {
//     id: 89757,
//     name: 'Tom',
//     gender: 'male'
// };
// te1.id = 001 //error
// 只读的约束存在于第一次给对象赋值的时候，而不是第一次给只读属性赋值的时候
// el:
// interface Teacher {
//     readonly id: number;
//     name: string;
//     age?: number;
//     [propName: string]: any;
// }

// let LiLi: Teacher = { //error
//     name: 'LiLi',
//     gender: 'male'
// };

// LiLi.id = 89757; //error
